package pe.gob.servir.apps.censodirectivo.common.dao;

import java.io.Serializable;
import java.util.List;

import javax.persistence.EntityManager;

import org.apache.log4j.Logger;

public abstract class AbstractJPABaseDAO<T extends Serializable> implements BaseDAO<T> {

	private static final Logger log = Logger.getLogger(AbstractJPABaseDAO.class);
	
	private Class<T> persistentClass;
	EntityManager entityManager;

	public AbstractJPABaseDAO(Class<T> persistentClass) {
		this.persistentClass = persistentClass;
	}

	protected abstract EntityManager getEntityManager();

	@Override
	public void insertar(T entity) {
		log.info("Insertando datos en BD.");
		getEntityManager().persist(entity);
	}

	@Override
	public void actualizar(T entity) {
		log.info("Actualizando datos en BD.");
		getEntityManager().merge(entity);
	}

	@Override
	public void eliminar(T entity) {
		log.info("Eliminando datos en BD.");
		getEntityManager().remove(getEntityManager().merge(entity));
	}

	@Override
	public T buscarPorId(long id) {
		log.info("Buscar datos por Id en BD.");
		return getEntityManager().find(persistentClass, id);
	}

	@Override
	public List<T> listarTodos() {
		log.info("Listar todos los registros.");
		javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
		cq.select(cq.from(persistentClass));
		return getEntityManager().createQuery(cq).getResultList();
	}

}